package com.example.swaggermocktest.controller;

import com.example.swaggermocktest.domain.User;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;

import java.util.ArrayList;
import java.util.List;

/**
 * GET（SELECT）：从服务器取出资源（一项或多项）。
 * POST（CREATE）：在服务器新建一个资源。
 * PUT（UPDATE）：在服务器更新资源（客户端提供改变后的完整资源）。
 * PATCH（UPDATE）：在服务器更新资源（客户端提供改变的属性）。
 * DELETE（DELETE）：从服务器删除资源。
 *
 * GET /zoos：列出所有动物园
 * POST /zoos：新建一个动物园
 * GET /zoos/ID：获取某个指定动物园的信息
 * PUT /zoos/ID：更新某个指定动物园的信息（提供该动物园的全部信息）
 * PATCH /zoos/ID：更新某个指定动物园的信息（提供该动物园的部分信息）
 * DELETE /zoos/ID：删除某个动物园
 * GET /zoos/ID/animals：列出某个指定动物园的所有动物
 * DELETE /zoos/ID/animals/ID：删除某个指定动物园的指定动物
 *
 * 我们总结一下什么是RESTful架构：
 * 　　（1）每一个URI代表一种资源；
 * 　　（2）客户端和服务器之间，传递这种资源的某种表现层；
 * 　　（3）客户端通过四个HTTP动词，对服务器端资源进行操作，实现"表现层状态转化"。
 *误区:
 *     最常见的一种设计错误，就是URI包含动词。因为"资源"表示一种实体，所以应该是名词，URI不应该有动词，动词应该放在HTTP协议中。
 *另一个设计误区，就是在URI中加入版本号：
 * 因为不同的版本，可以理解成同一种资源的不同表现形式，所以应该采用同一个URI。版本号可以在HTTP请求头信息的Accept字段中进行区分
 *
 * --------------------------------------------------
 * 这里开始编写自己的RESTful Controller，跟正常开发没什么区别。主要是接口方法上面新增了几个注解：
 *
 * 通过@ApiOperation注解来给API增加说明
 * 通过@ApiImplicitParams、@ApiImplicitParam注解来给参数增加说明
 * 通过@ApiIgnore来忽略那些不想让生成RESTful API文档的接口
 * ---------------------------------------------------
 * 打开浏览器访问：http://localhost:8080/swagger-ui.html
 *
 * 如何关联easymock呢?
 * 登录https://www.easy-mock.com/官网
 * 新建项目:
 * 点进去项目,里面有个设置,下边有个----->Swagger Docs API (可选)
 * 选择url,把你的swagger路径扔进去-
 * 我这个是本地用ngrok做了外网映射,不然别人服务器同步你的本地地址肯定找不到了--
 * 外网映射工具自行了解(国内的ngrok,natapp都可以)
 * >>>> http://xpc.free.idcfengye.com/swaggermocktest/v2/api-docs
 *
 */
@Api(value="用户controller",description="用户操作",tags={"用户操作接口"})
@RestController
@RequestMapping("/demo")
public class UserController {


    @ApiOperation(value="更新用户", notes="根据User对象更新用户")
    @ApiImplicitParams({
            @ApiImplicitParam(dataType = "java.lang.Long", name = "id", value = "id", required = true, paramType = "path"),
            @ApiImplicitParam(dataType = "User", name = "user", value = "用户信息", required = true)
    })
    @PutMapping(value = "/user/{id}")
    public User update(@PathVariable Long id, @RequestBody User user){

        System.out.println("id:"+id+", user:"+user);
        user.setId(id);

        return user;
    }


    @ApiOperation(value="创建用户", notes="根据User对象创建用户")
    @ApiImplicitParams({
            @ApiImplicitParam(dataType = "java.lang.Long", name = "id", value = "id", required = true, paramType = "path"),
            @ApiImplicitParam(dataType = "User", name = "user", value = "用户信息", required = true)
    })
    @PostMapping(value = "/user/{id}")
    public User insert(@PathVariable Long id, @RequestBody User user){

        System.out.println("id:"+id+", user:"+user);
        user.setId(id);

        return user;
    }

    @ApiOperation(value="获取指定id用户详细信息", notes="根据user的id来获取用户详细信息")
    @ApiImplicitParam(name = "id",value = "用户id", dataType = "String", paramType = "path")
    @GetMapping(value = "/user/{id}")
    public User getUser(@PathVariable Long id){

        User user = new User();
        user.setId(id);
        user.setPassword("abc");
        user.setUsername("12345");
        return user;
    }

    @ApiOperation(value="获取所有用户详细信息", notes="获取用户列表信息")
    @GetMapping(value = "/users")
    public List<User> getUserList(){

        List<User> list = new ArrayList<>();
        User user = new User();
        user.setId(15L);
        user.setPassword("ricky");
        user.setUsername("root");

        list.add(user);

        return list;
    }

    //@ApiIgnore
    @ApiOperation(value="删除指定id用户", notes="根据id来删除用户信息")
    @ApiImplicitParam(name = "id",value = "用户id", dataType = "java.lang.Long", paramType = "path")
    @DeleteMapping(value = "/user/{id}")
    public String delete(@PathVariable Long id){
        System.out.println("delete user:"+id);
        return "OK";
    }
}
